C/C++常用算法【C语言顺序查找(顺序表)】【2】

顺序表结构的存储方式非常容易理解,操作也十分方便。但是顺序表结构有如下一些缺点:
1.在插入或者删除结点时,往往需要移动大量的数据。
2.如果表比较大,有时难以分配足够的连续存储空间,往往导致内存分配失败,而无法存储。
后面会有链表结构的章节。

直接上代码,代码中有详细注释,请自己领悟

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 100 //定义顺序表的最大长度

typedef struct {
    char key[10]; //结点的关键字
    char name[20];
    int age;
} DATA;
                  //定义结点类型

typedef struct{  //定义顺序表结构
    DATA ListData[MAXLEN+1]; //保存顺序表的结构数组
    int ListLen;  //顺序表已存结点的数量
} SLType;
/**定义了顺序表的最大长度MAXLEN,顺序表数据元素的类型DATA及顺序表的数据结构SLType。
    在数据结构SLType中,ListLen为顺序表已存结点的数量,也就是当前顺序表的长度,
    ListData是一个结构数组,用来存放各个数据结点。
    在这里可以认为该顺序表是一个班级学生的记录。其中,key为学号,
    name为学生的姓名,age为年龄。
    这里为了便于大家理解,从下标1开始记录数据结点,下标0不用。

**/

//初始化顺序表
void SLInit(SLType *SL){
    SL->ListLen=0;   //初始化为空表
}
/**这里并没有清空一个顺序表,你们可以采用相应的程序代码来清空。
    这里我们只需要简单的将结点数量ListLen设置为0即可,这样如果
    顺序表中原来已有数据,也将会被覆盖,并不影响操作,反而提高
    了处理的速度。
**/

//计算顺序表的长度
int SLLength(SLType *SL){
    return (SL->ListLen);   //返回顺序表的元素数量
}

//插入结点
int SLInsert(SLType *SL,int n,DATA data){
    int i;
    if(SL->ListLen>=MAXLEN){                 //顺序表结点数量已超过最大数量
        printf("顺序表已满,不能插入结点!\n");
        return 0;                       //返回0,表示插入不成功
    }
    if(n<1||n>SL->ListLen-1){  //插入结点序号不对
        printf("插入元素序列错误,不能插入元素!\n");
        return 0;                  //返回0,表示插入不成功
    }
    for(i=SL->ListLen;i>=n;i--){//将顺序表中的数据向后移
        SL->ListData[i+1]=SL->ListData[i];
    }
    SL->ListData[n]=data; //插入结点
    SL->ListLen++;         //顺序表结点数量加1
    return 1;          //成功插入,返回1
}
/**在这里,该程序中首先判断顺序表结点数量是否已超过最大数量,
    以及插入结点序号是否正确。当所有条件都满足后,便将顺序表中n
    之后的元素向后移动,同时插入结点,并更新结点数量ListLen。
**/

//追加结点
int SLAdd(SLType *SL,DATA data){//增加元素到顺序表尾部
    if(SL->ListLen>=MAXLEN){        //顺序表已满
        printf("顺序表已满,不能再添加结点了!\n");
        return 0;
    }
    (SL->ListData[++SL->ListLen])=data; //先自加一
    return 1;
}
/**简单的判断这个顺序表是否已经满了,然后再追加结点,并更新结点数量就可以了。
**/

//删除结点
int SLDeletd(SLType *SL,int n){//删除顺序表中的数据元素
    int i;
    if(n<1||n>SL->ListLen){   //删除结点序号不正确
        printf("删除结点序号错误,不能删除结点!\n");
        return 0;
    }
    for(i=n;i<SL->ListLen;i++){
        SL->ListData[i]=SL->ListData[i+1];
    }
    SL->ListLen--;  //顺序表元素减1
    return 1;
}
//先判断,然后移动结点,最后更新ListLen。

//按照序号查找结点
DATA *SLFindByNum(SLType *SL,int n){
    if(n<1||n>SL->ListLen+1){   //元素序号不正确
        printf("结点序号错误,不能返回结点!\n");
        return NULL;   //不成功,返回0;
    }
    return &(SL->ListData[n]);
}

//按照关键字查找结点(这里用key作为关键字)
int SLFindByCont(SLType *SL,char *key){
    int i;
    for(i=1;i<=SL->ListLen;i++){
        if(strcmp(SL->ListData[i].key,key)==0){//函数返回0,说明这2个字符数组相等
            //如果找到所需结点
            return i;
        }
    }
    return 0;
}

//显示所有的结点
int SLAll(SLType *SL){
    int i;
    for(i=1;i<=SL->ListLen;i++){
        printf("(%s,%s,%d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
    }
    return 0;
}

int main(){
    int i;
    SLType SL; //定义顺序表变量
    DATA data; //定义结点保存数据类型变量
    DATA *pdata;  //定义结点保存指针变量
    char key[10];  //保存关键字


    printf("顺序表操作演示!\n");
    SLInit(&SL);    //初始化顺序表
    printf("...\n");
    printf("初始化顺序表完成!\n");

    do{    //循环添加结点数据
        printf("请输入添加的结点(学号 姓名 年龄):  ");
        fflush(stdin);                              ///清空输入缓存区
        scanf("%s%s%d",&(data.key),&data.name,&data.age);
        if(data.age){  //若年龄不为0,也就是年龄为0时退出循环
            if(!SLAdd(&SL,data)){ //若添加结点失败
                break;
            }
        }else{  //如果年龄为0
            break;  //退出死循环
        }
    }while(1);

    printf("\n顺序表中结点顺序为:\n");
    SLAll(&SL);   //显示所有结点

    fflush(stdin);   //清空缓冲区
    printf("\n请输入要取出的结点的序号: ");
    scanf("%d",&i);
    pdata = SLFindByNum(&SL,i);
    if(pdata){//若返回的结点指针不为NULL
        printf("第%d个结点为:(%s,%s,%d)",i,pdata->key,pdata->name,pdata->age);
    }

    fflush(stdin);
    printf("\n请输入要查找结点的关键字: ");
    scanf("%s",key);
    i=SLFindByCont(&SL,key);
    pdata=SLFindByNum(&SL,i);
    if(pdata){//若返回的结点指针不为NULL
        printf("第%d个结点为:(%s,%s,%d)",i,pdata->key,pdata->name,pdata->age);
    }
    getch();

    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 C 语言中,可以使用 for 循环来实现基于顺序顺序查找。首先需要定义一个顺序,并将要查找的元素值存储在变量中。然后,可以使用 for 循环遍历顺序中的每个元素,并比较元素值和要查找的值是否相同。如果相同,则找到了要查找的元素,并可以结束循环。如果在遍历完整个顺序后都没有找到要查找的元素,则可以认为该元素不存在。 以下是一个简单的示例代码,展示了如何使用 for 循环实现基于顺序顺序查找: ``` #define MAX_SIZE 10 // 定义顺序的最大长度 int list[MAX_SIZE]; // 定义一个整型顺序 int n; // 定义顺序中元素的个数 int x; // 定义要查找的元素值 int main() { // 在此处为顺序赋值 // 假设顺序中的元素值为 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 n = 10; for (int i = 0; i < n; i++) { list[i] = i + 1; } // 输入要查找的元素值 printf("请输入要查找的元素值:"); scanf("%d", &x); // 顺序查找 int pos = -1; // 定义查找结果的位置,初始化为 ### 回答2: 顺序查找是一种简单直观的查找算法,基于顺序顺序查找即在一个顺序中按照顺序逐个比较元素,直到找到目标元素或者查找结束。 基于顺序顺序查找算法可通过以下步骤来实现: 1. 定义一个顺序,将待查找的元素存储在其中。 2. 从头开始,逐个遍历顺序的元素。 3. 比较当前元素与目标元素是否相等,如果相等则示找到目标元素;如果不相等则继续遍历下一个元素。 4. 如果遍历到尾仍未找到目标元素,则查找失败。 下面是一个用C语言实现的基于顺序顺序查找的示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序的最大容量 int sequential_search(int arr[], int n, int target) { for(int i = 0; i < n; i++) { if(arr[i] == target) { return i; // 返回目标元素的索引 } } return -1; // 查找失败 } int main() { int arr[MAX_SIZE] = {1, 3, 5, 7, 9}; // 假设顺序中存储了这几个元素 int n = 5; // 顺序中的元素个数 int target = 5; // 待查找的目标元素 int result = sequential_search(arr, n, target); if(result == -1) { printf("查找失败\n"); } else { printf("目标元素在顺序中的索引为:%d\n", result); } return 0; } ``` 以上示例代码中,顺序中存储了几个整数,通过调用`sequential_search`函数进行顺序查找,如果找到目标元素,则返回它在顺序中的索引,否则返回-1查找失败。 ### 回答3: 顺序查找是一种简单直接的查找方式,基于顺序顺序查找可以使用C语言来实现。 首先,我们需要定义一个顺序结构体,包含一个存储元素的数组和一个记录当前元素个数的变量。可以定义如下: ``` #define MAX_SIZE 100 // 定义顺序的最大长度 typedef struct { int data[MAX_SIZE]; int length; } SeqList; ``` 接下来,我们可以实现顺序查找的函数。顺序查找的思路是从的第一个元素开始逐个比较,直到找到目标元素或者遍历完整个。实现代码如下: ``` int sequentialSearch(SeqList list, int target) { for (int i = 0; i < list.length; i++) { if (list.data[i] == target) { return i; // 返回目标元素在中的位置 } } return -1; // 目标元素不存在 } ``` 在主函数中,我们可以创建一个顺序,并调用顺序查找函数来查找目标元素的位置。示例代码如下: ``` int main() { SeqList list; list.length = 6; list.data[0] = 2; list.data[1] = 4; list.data[2] = 6; list.data[3] = 8; list.data[4] = 10; list.data[5] = 12; int target = 8; int position = sequentialSearch(list, target); if (position == -1) { printf("目标元素不存在\n"); } else { printf("目标元素在中的位置为:%d\n", position); } return 0; } ``` 以上就是使用C语言编写基于顺序顺序查找的示例代码,通过逐个比较顺序中的元素,我们可以找到目标元素在中的位置。如果目标元素不存在,则返回-1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谙忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值